import 'dart:collection';

import 'package:flutter/material.dart';
import 'package:flutterapp/chapter/seven/provider_widget.dart';

/// @date 2020/08/04  15:50
/// @author 程志强
/// @des 跨组件状态共享（Provider）

class ProviderWidget extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("跨组件状态共享（Provider）"),
      ),
      body: _body1(context),
    );
  }

  // 优化body
  Widget _body1(BuildContext context) {
    return Center(
      child: ChangeNotifierProvider<CartModel>(
        data: CartModel(),
        child: Builder(builder: (context) {
          return Column(
            children: <Widget>[
              Consumer<CartModel>(
                builder: (context, val) => Text("总价：${val.totalPrice}"),
              ),
              Builder(
                builder: (context) {
                  print("RaiseButton build===");
                  return RaisedButton(
                    child: Text("添加商品"),
                    onPressed: () =>
                        ChangeNotifierProvider.of2<CartModel>(context,listen: false)
                            .add(Item(20.0, 1)),
                  );
                },
              ),
            ],
          );
        }),
      ),
    );
  }

  Widget _body(BuildContext context) {
    return Center(
      child: ChangeNotifierProvider<CartModel>(
        data: CartModel(),
        child: Builder(builder: (context) {
          return Column(
            children: <Widget>[
              Builder(
                builder: (context) {
                  var cart = ChangeNotifierProvider.of<CartModel>(context);
                  return Text("总价：${cart.totalPrice}");
                },
              ),
              Builder(
                builder: (context) {
                  print("RaiseButton build");
                  return RaisedButton(
                    child: Text("添加商品"),
                    onPressed: () =>
                        ChangeNotifierProvider.of<CartModel>(context)
                            .add(Item(20.0, 1)),
                  );
                },
              ),
            ],
          );
        }),
      ),
    );
  }
}

class Item {
  // 单价
  double price;

  // 数量
  int count;

  Item(this.price, this.count);
}

// 购物车模型
class CartModel extends ChangeNotifier {
  final List<Item> _items = [];

  // 禁止改变购物车里的商品信息
  UnmodifiableListView<Item> get items => UnmodifiableListView(_items);

  // 购物车中商品的总价
  double get totalPrice => _items.fold(
      0,
      (previousValue, element) =>
          previousValue + element.count * element.price);

  // 将 [item] 添加到购物车。这是唯一一种能从外部改变购物车的方法。
  void add(Item item) {
    _items.add(item);
    // 通知监听器（订阅者），重新构建InheritedProvider， 更新状态。
    notifyListeners();
  }
}
